/**
 * \file fs/fs.h
 * \author Davide Gessa
 * \date 11-18-09
 */
#ifndef FS_FS_H
#define FS_FS_H

#include <types.h>

#define MOUNT_POINT_NAME_SIZE	512		///< Dimensione massima path del mount point
#define NODE_NAME_SIZE	255				///< Dimensione massima nome inode
#define NODE_TYPE_FILE	1				///< Tipo nodo: file
#define NODE_TYPE_DIR	2				///< Tipo nodo: dir
#define NODE_MAX_NUMBER	1024

/**
 * Struttura di un inode
 */
typedef struct inode_p
{
	char name[NODE_NAME_SIZE];		///< Nome del nodo
	uint32_t inode_n;				///< Numero del nodo
	uint8_t type;					///< Tipo di nodo
	
	uint8_t ow:1;					///< Indica se il nodo puo' essere cancellato dall'albero
	
	void *data;						///< Dati
	uint32_t size;					///< Dimensione
	
	struct inode_p *next;			///< Prossimo nodo
	struct inode_p *prev;			///< Precedente nodo
	struct inode_p *parent;			///< Nodo padre
	struct inode_p *childs;			///< Nodo figlio
} inode_t;



/**
 * Struttura di un elemento di una directory, posix compatible
 */
struct dirent
{
	char name[NODE_NAME_SIZE];		///< Nome
	uint32_t inode;					///< Numero nodo
};


#include <fs/mount.h>
#include <driver.h>
#include <fs/file.h>



inode_t *fs_root;				///< Radice del filesystem
uint32_t node_n;				///< Numero nodi ow

void fs_init();
uint32_t fs_check_name(char *);
uint32_t fs_get_node(char *, inode_t **);
uint32_t fs_tree_cleanup(inode_t *, int);
uint32_t fs_path_split(char *, char **);
void fs_show_tree(inode_t *, uint32_t);
inode_t *fs_create_node(char *, inode_t *, uint8_t, uint8_t);



uint32_t fs_read_dir(char *, uint32_t , struct dirent *);


#endif
